/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package model.dao;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.PrintWriter;
import java.util.ArrayList;
import model.pojo.Disciplina;

public final class DisciplinaDaoImpl implements DisciplinaDao {

    private ArrayList<Disciplina> listaDisciplina;

    public DisciplinaDaoImpl() {
        try {
            this.listaDisciplina = carregarDisciplinas();
        } catch (IOException e) {
        }
    }

    @Override
    public ArrayList<Disciplina> getListaDisciplina() {
        return this.listaDisciplina;
    }

    /**
     *
     * @param disciplinas = listaDisciplina a ser substituida
     */
    @Override
    public void setDisciplina(ArrayList<Disciplina> disciplinas) {
        this.listaDisciplina = disciplinas;
    }

    /**
     *
     * @return = retorna listaDisciplina contida no objeto
     */
    @Override
    public ArrayList<Disciplina> getDisciplinas() {
        return this.listaDisciplina;
    }

    /**
     *
     * @param disciplina = disciplina a ser adicionada na listaDisciplina
     */
    @Override
    public boolean addDisciplina(Disciplina disciplina) {
        if (listaDisciplina.contains(disciplina)) {
            return false;
        } else {
            disciplina.setId(novoId());
            this.listaDisciplina.add(disciplina);
            return true;
        }
    }

    /**
     *
     * @param disciplina
     * @return Se a lista de disciplinas estiver vazia retorna false, caso contrário retorna true.
     */
    @Override
    public boolean contains(Disciplina disciplina) {
        Integer i;
        if (listaDisciplina.isEmpty()) {
            return false;
        }
        for (i = 0; i < this.listaDisciplina.size(); i++) {
            if ((listaDisciplina.get(i).getNome().equals(disciplina.getNome()))
                    && (listaDisciplina.get(i).getCargaHoraria() == (disciplina.getCargaHoraria()))
                    && (listaDisciplina.get(i).getEmenta().equals(disciplina.getEmenta()))) {
                return true;
            }
        }
        return false;
    }

    /**
     *
     * @param disciplinas
     * @throws IOException Lança exceção caso ocorra erro ao salvar a lista de disciplinas no arquivo.
     */
    @Override
    public void salvarDisciplina(ArrayList<Disciplina> disciplinas) throws IOException {
        try (FileWriter writer = new FileWriter("Disciplinas.txt", false);
                PrintWriter saida = new PrintWriter(writer, true)) {
            int i;
            for (i = 0; i < disciplinas.size(); i++) {
                writer.write(disciplinas.get(i).getId() + ";" + disciplinas.get(i).getCargaHoraria() + ";" + disciplinas.get(i).getNome()
                        + ";" + disciplinas.get(i).getEmenta() + "\n");
            }
        }
    }

    /**
     *
     * @return Retorna a lista de disciplina caso ela exista, se não cria uma lista nova.
     * @throws IOException
     */
    @Override
    public ArrayList<Disciplina> carregarDisciplinas() throws IOException {
        ArrayList<Disciplina> list;
        list = new ArrayList<>();
        File file = new File("Disciplinas.txt");
        if (!file.exists()) {
            file.createNewFile();
        }
        try (BufferedReader in = new BufferedReader(new FileReader(file))) {
            String str;
            while ((str = in.readLine()) != null) {
                String[] t = str.split(";");
                Disciplina disciplina = new Disciplina(Integer.parseInt(t[0]), Integer.parseInt(t[1]), t[2], t[3]);
                list.add(disciplina);
            }
        }
        return list;
    }

    /**
     *
     * @return Retorna 0 caso a lista de disciplinas esteja vazia, caso contrario retorna o ID do próximo elemento.
     */
    @Override
    public Integer novoId() {
        if (listaDisciplina.isEmpty()) {
            return 0;
        }
        return listaDisciplina.get(listaDisciplina.size() - 1).getId() + 1;
    }

    /**
     *
     * @return Retorna 0 caso a lista de disciplinas esteja vazia, caso contrário retorna o ID do último elemento.
     */
    @Override
    public Integer ultimoId() {
        if (listaDisciplina.isEmpty()) {
            return 0;
        }
        return listaDisciplina.get(listaDisciplina.size() - 1).getId();
    }
}